2004年03月16日
川俣晶の縁側IT都市伝説 total 35231 count

クラスのメンバー変数へのアクセサはgetとsetの2種類がある

Written By: 川俣 晶連絡先

 誰が言い出したのか、まことしやかに流布される謎の解釈。

 今回のIT都市伝説はこれだ!

クラスのメンバー変数にはアクセサを付けるべし §

 一般的なオブジェクト指向プログラミングの常識として、クラスのメンバー変数は外部からアクセスできないようにprivateのようなキーワードで修飾し、変数へアクセスする手段としてアクセサ(Javaなどではメソッド、C#などプロパティ)を用意すべきであると言われます。

 このとき、アクセサには値を取得するためのgetと値を設定するためのsetの2つを用意します。Javaでは一般的に、getとsetで始まる名前のメソッドを用意します。C#ではプロパティに構文の中で、getとsetのキーワードを用いて記述します。getとsetを両方作成せず、片方だけ使うこともありますが、使用するものはgetとsetしかありません。特にプロパティの構文により種類が規定されるC#では、getとset以外の何かを書こうとしても構文エラーになります。

getとsetの他にもアクセサがある? §

 実は、getとsetの他にもう1つの種類が存在するプログラム言語があります。バージョン6.0までのVisual Basic(以下VB)です。VBのプロパティの構文では、Get, Let, Setの3種類の機能を記述することができます。

 実際にこの3種類を使った例を拙著プロフェッショナルVB.NETプログラミング 第9回 オブジェクト関連(前編) から以下に引用します。

Private str As String

Private obj As Object

Public Property Get test1() As String

  test1 = "Hello World!"

End Property

Public Property Let test1(s As String)

  str = s

End Property

Public Property Get test2() As Object

  Set test2 = obj

End Property

Public Property Set test2(o As Object)

  Set obj = o

End Property

 ここで気になるのは、Letなる見慣れないものは何者かということですが、これは値の代入を行う機能を示すキーワードです。これに対して、Setは参照の代入を示します。VBでは、値の代入と参照の代入ははっきりと構文上区別されています。この点で、値の代入と参照の代入が構文上区別されないJava、C#、Visual Basic.NETとは明らかに異なる特徴を持ちます。

 通常の代入文でも、この2つは区別されます。

 値の代入はLetキーワードを用いて、以下のように記述します。

Let test1 = "Hello World!"

 通常はLetを省略して、以下のように記述します。

test1 = "Hello World!"

 参照の代入は以下のようにSetキーワードを使用して記述します。

Set test2 = obj

 取得の構文に関しては、値と参照で区別はありません。

 以上のようなことから、アクセサは常にgetとsetの2種類しかない、と決まったものではないと言えます。少なくとも、値の代入と参照の代入に構文上の区別を用意すると、少なくとも3種類が必要とされます。

余談 §

 個人的な感想を言えば、値の代入と参照の代入は機能性が全く異なり、取り違えるとバグの元にもなり、区別する価値があると感じます。(値の代入とは、対象の複製を作る行為であるのに、参照の代入は複製を作らない)

 その点から考えると、値の代入と参照の代入を区別しなくなったVisual Basic.NETは、この点に関してVisual Basic 6.0と比べて退化したという感もあります。また、値型と参照型を持ちながら、値の代入と参照の代入の区別が明確ではない全てのプログラム言語は(Visual Basic.NETやC#はもとよりJavaも含めて)イマイチ物足りない、という評価もあり得るでしょう。

2011/05/06追記 §

 名乗らないで以下のようなコメントを寄せてきた人がいますが、本文に書いた通り「バージョン6.0までのVisual Basic」を対象とした話をしています。Visual Basic .NETはこの範囲に含まれません。含まれないので、通用しなくて当たり前です。当たり前のことを述べて恥をかくとわかっていたので、あえて名乗らなかったのでしょうか?

ID: 20040316113833

Subject: クラスのメンバー変数へのアクセサはgetとsetの2種類がある

Keyword: 【▲→川俣晶の縁側→IT都市伝説】

URL: http://mag.autumn.org/Content.modf?id=20040316113833

名前:

メールアドレス:

本文:

http://mag.autumn.org/Content.modf?id=20040316113833 はVisual Basic .NETでは通用しません。